package beans;

import bc.TipoCambioDelegate;
import edu.upn.sigemfi.ope.be.Moneda;
import edu.upn.sigemfi.ope.be.TipoCambio;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;

public class TipoCambioController {

    private TipoCambio tipoCambio;
    private Double promedio;
    private Double sumaprecios;
    private String criterio;
    private TipoCambioDelegate delegate;
    private Moneda moneda;
    private Date fecha;



    public TipoCambioController() {
        delegate = new TipoCambioDelegate();
        fecha = new Date();
    }

    public String getCriterio() {
        return criterio;
    }

    public void setCriterio(String criterio) {
        this.criterio = criterio;
    }

    public TipoCambio getTipoCambio() {
        return tipoCambio;
    }

    public void setTipoCambio(TipoCambio tipoCambio) {
        this.tipoCambio = tipoCambio;
    }

    public Double getpromedio() {
        if (tipoCambio != null) {
            if (tipoCambio.getPrecioCompra() != null && tipoCambio.getPrecioVenta() != null) {
                sumaprecios = (tipoCambio.getPrecioCompra() + tipoCambio.getPrecioVenta());
                promedio = sumaprecios/2;
            } else {
                promedio = 0.0;
            }
        }
        return promedio;
    }

    public void setPromedio(Double promedio) {
        this.promedio = promedio;
    }

    public String editar(){
        return "editar";
    }

    public String preferencial() {
        tipoCambio = new TipoCambio();
        tipoCambio.setTipo("Comercial");
        tipoCambio.setPrecioCompra(0.0);
        tipoCambio.setPrecioVenta(0.0);

        return "preferencial";
    }

    public String exclusivo() {
        tipoCambio = new TipoCambio();
        tipoCambio.setTipo("SBS");
        tipoCambio.setPrecioCompra(0.0);
        tipoCambio.setPrecioVenta(0.0);

        return "exclusivo";
    }

    public String cancelar() {
        tipoCambio = null;
        return "volver";
    }

    public String registrar() {
        tipoCambio.setPrecioPromedio(promedio);
        moneda = new Moneda();
        if (tipoCambio.getTipo() == "SBS"){
                tipoCambio.setTipo("SBS");
        }
        else{
            tipoCambio.setTipo("Comercial");
        }
        moneda = new Moneda();
        moneda.setIdMoneda(1L);
        tipoCambio.setFidOpeMoneda(moneda);
         fecha = new Date();
        tipoCambio.setFecha((fecha.getDate()) + "/" + (fecha.getMonth() + 1) + "/" + (fecha.getYear() + 1900));

        try {
            if (tipoCambio != null && tipoCambio.getPrecioPromedio() != 0.0 && tipoCambio.getPrecioCompra() != 0.0 && tipoCambio.getPrecioVenta() != 0.0  && tipoCambio.getPrecioVenta() > tipoCambio.getPrecioCompra() || tipoCambio.getPrecioVenta() == tipoCambio.getPrecioCompra()) {
                delegate.editar(tipoCambio);
                mostrarMensaje("Exito", "La actualizacion del tipo de cambio se realizo exitosamente.", FacesMessage.SEVERITY_INFO);
            }else if (tipoCambio != null && tipoCambio.getPrecioPromedio() != 0.0 && tipoCambio.getPrecioCompra() == 0.0 && tipoCambio.getPrecioVenta() != 0.0 || tipoCambio.getPrecioVenta() == tipoCambio.getPrecioCompra()) {
                mostrarMensaje("El precio de Compra no puede ser 0", "...", FacesMessage.SEVERITY_ERROR);
                return "";
            }
            else if (tipoCambio != null && tipoCambio.getPrecioPromedio() != 0.0 && tipoCambio.getPrecioCompra() != 0.0 && tipoCambio.getPrecioVenta() == 0.0 || tipoCambio.getPrecioVenta() == tipoCambio.getPrecioCompra()) {
                mostrarMensaje("El precio de Venta no puede ser 0", "...", FacesMessage.SEVERITY_ERROR);
                return "";
            }
            else if (tipoCambio != null && tipoCambio.getPrecioPromedio() != 0.0 && tipoCambio.getPrecioCompra() != 0.0 && tipoCambio.getPrecioVenta() != 0.0  && tipoCambio.getPrecioVenta() < tipoCambio.getPrecioCompra() || tipoCambio.getPrecioVenta() == tipoCambio.getPrecioCompra()) {
                mostrarMensaje("El precio de Venta no puede ser menor que el precio de Compra", "...", FacesMessage.SEVERITY_ERROR);
                return "";
            }
            else if (tipoCambio != null && tipoCambio.getPrecioPromedio() != 0.0 && tipoCambio.getPrecioCompra() != 0.0 && tipoCambio.getPrecioVenta() != 0.0  || tipoCambio.getPrecioVenta() != tipoCambio.getPrecioCompra()) {
                mostrarMensaje("El precio de Compra no puede ser igual al precio de Venta", "...", FacesMessage.SEVERITY_ERROR);
                return "";
            }

            else {
                mostrarMensaje("Error", "Asegurese de haber seleccionado una cambio", FacesMessage.SEVERITY_ERROR);
                return "";
            }
        } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return "volver";
    }

    public String actualizar() {
         tipoCambio.setPrecioPromedio(promedio);
        try {
            if (tipoCambio != null && tipoCambio.getPrecioPromedio() != 0.0 && tipoCambio.getPrecioCompra() != 0.0 && tipoCambio.getPrecioVenta() != 0.0  && tipoCambio.getPrecioVenta() > tipoCambio.getPrecioCompra() || tipoCambio.getPrecioVenta() == tipoCambio.getPrecioCompra()) {
                delegate.editar(tipoCambio);
                mostrarMensaje("Exito", "La actualizacion del tipo de cambio se realizo exitosamente.", FacesMessage.SEVERITY_INFO);
            }else if (tipoCambio != null && tipoCambio.getPrecioPromedio() != 0.0 && tipoCambio.getPrecioCompra() == 0.0 && tipoCambio.getPrecioVenta() != 0.0 || tipoCambio.getPrecioVenta() == tipoCambio.getPrecioCompra()) {
                mostrarMensaje("El precio de Compra no puede ser 0", "...", FacesMessage.SEVERITY_ERROR);
                return "";
            }
            else if (tipoCambio != null && tipoCambio.getPrecioPromedio() != 0.0 && tipoCambio.getPrecioCompra() != 0.0 && tipoCambio.getPrecioVenta() == 0.0 || tipoCambio.getPrecioVenta() == tipoCambio.getPrecioCompra()) {
                mostrarMensaje("El precio de Venta no puede ser 0", "...", FacesMessage.SEVERITY_ERROR);
                return "";
            }
            else if (tipoCambio != null && tipoCambio.getPrecioPromedio() != 0.0 && tipoCambio.getPrecioCompra() != 0.0 && tipoCambio.getPrecioVenta() != 0.0  && tipoCambio.getPrecioVenta() < tipoCambio.getPrecioCompra() || tipoCambio.getPrecioVenta() == tipoCambio.getPrecioCompra()) {
                mostrarMensaje("El precio de Venta no puede ser menor que el precio de Compra", "...", FacesMessage.SEVERITY_ERROR);
                return "";
            }
            else if (tipoCambio != null && tipoCambio.getPrecioPromedio() != 0.0 && tipoCambio.getPrecioCompra() != 0.0 && tipoCambio.getPrecioVenta() != 0.0  || tipoCambio.getPrecioVenta() != tipoCambio.getPrecioCompra()) {
                mostrarMensaje("El precio de Compra no puede ser igual al precio de Venta", "...", FacesMessage.SEVERITY_ERROR);
                return "";
            }

            else {
                mostrarMensaje("Error", "Asegurese de haber seleccionado una cambio", FacesMessage.SEVERITY_ERROR);
                return "";
            }
        } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return "volver";
    }

    public String eliminar() {
        try {
           if (tipoCambio != null) {
                delegate.eliminar(tipoCambio);
               mostrarMensaje("Exito", "La eliminacion del tipo de cambio se realizo exitosamente.", FacesMessage.SEVERITY_INFO);
            } else {
                mostrarMensaje("Error", "Asegurese de haber seleccionado una cambio", FacesMessage.SEVERITY_ERROR);
                return "";
            }
       } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return "listar";
    }

    public List<TipoCambio> getTipoCambios() {
        try {
            return delegate.getTipoCambios();
        } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
            e.printStackTrace();
        }
        return null;
    }

    public TipoCambio buscar(Long idCambio) {
        try {
            return delegate.buscar(idCambio);
        } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
        }
        return null;
    }

    public SelectItem[] getTipoCambioSI() {
        SelectItem[] select = null;
        try {
            List<TipoCambio> lista = getTipoCambios();
            if (lista != null) {
                select = new SelectItem[lista.size() + 1];
                int i = 0;
                select[i++] = new SelectItem(null, "Seleccione una Cambio");
                for (TipoCambio go : lista) {
                    select[i++] = new SelectItem(go, go.getIdCambio().toString());
                }
            } else {
                select = new SelectItem[1];
                select[0] = new SelectItem(null, "No se encontraron Cambios");
            }
        } catch (Exception e) {
            mostrarMensaje(e.getMessage(), e.getMessage(), FacesMessage.SEVERITY_ERROR);
            select = new SelectItem[1];
            select[0] = new SelectItem(null, "Error al consultar los datos");
        }
        return select;
    }

    //Metodo para mostrar mensajes en la pagina
    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    public TipoCambio buscar_TipoCambio(Long id) throws Exception {
        return buscar(id);
    }

    /**
     * @return the fecha
     */
    public Date getFecha() {
        return this.fecha;
    }

    /**
     * @param fecha the fecha to set
     */
    public void setFecha(Date fecha) {
        this.fecha = fecha;
    }

    public Date Fecha() {
        setFecha(new Date());
        return getFecha();
    }
}
